#ifndef HEAD_H
#define HEAD_H
#include <sys/types.h>
#include <pwd.h>
#include <grp.h>
#include <dirent.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <signal.h>
#include <time.h>
#include <string.h>
#include <error.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <ifaddrs.h>
#include <netinet/in.h>
#include <sys/epoll.h>
#include <pthread.h>
#include <stdint.h>
#include <stddef.h>
#include <crypt.h> 
#include <sys/stat.h>
#include <shadow.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <sys/wait.h>
#include <errno.h>
#include <crypt.h>
#include <mysql/mysql.h>


typedef int SocketFd;             // 套接字描述符类型
#define BUFFER_SIZE 4096          // 网络传输缓冲区大小
#define MAX_PATH_LEN 256          // 文件路径最大长度
#define MAX_USERNAME_LEN 32       // 用户名最大长度
#define MAX_PASSWD_LEN 64         // 密码最大长度
#define MAX_DETAIL_LEN 512        // 日志详情最大长度
#define MAX_USERNAME_LEN 32       //登录用户的最大长度
#define MAX_FILENAME_LEN 256      //真实目录
#define MAX_FILE_TYPE_LEN 1       //文件和目录的标识
#define MAX_HASH_FILE_NAME_LEN    //哈希文件名的最大长度


#define MAX_NAME_LEN 1024
#define MAX_QUERY_LEN 4096




// 检查命令行参数数量是否符合预期
#define ARGS_CHECK(argc, expected) \
    do { \
        if ((argc) != (expected)) { \
            fprintf(stderr, "args num error!\n"); \
            exit(1);\
        }\
    } while (0)                     

// 检查返回值是否是错误标记,若是则打印msg和错误信息
#define ERROR_CHECK(ret, error_flag, msg) \
    do { \
        if ((ret) == (error_flag)) { \
            perror(msg); \
            exit(1); \
        } \
    } while (0)           

// 检查线程是错误标记,若是则打印msg和错误信息
#define PTHREAD_ERROR_CHECK(ret, msg) \
    do { \
        if ((ret) !=0) { \
            fprintf(stderr,"%s:%s\n",msg,strerror(ret)); \
        } \
    } while (0)



#define MYSQL_QUERY_CHECK(ret, mysql) \
	do { \
	    if(ret != 0){ \
	      fprintf(stderr, "%s:%s\n", "mysql_query", mysql_error(mysql)); \
	      return -1; \
	    } \
	} while (0)
//需要mysql_field_count来检查上次是不是select语句
#define MYSQL_STORE_RESULT_CHECK(table ,mysql) \
	do { \
	    if(table == NULL){ \
          if(mysql_field_count(mysql) != 0) { \
	        fprintf(stderr, "%s:%s\n", "mysql_store_result", mysql_error(mysql)); \
	        return -1; \
          } \
	    } \
	} while (0)


    #endif
